da23955501f37a9d62c35f312cb47c59eb4d629c
[openwrt/openwrt.git] /
1 From 812a2751e827fa1eb01f3bd268b4d74c23f4226a Mon Sep 17 00:00:00 2001
2 From: Lorenzo Bianconi <lorenzo@kernel.org>
3 Date: Wed, 21 Aug 2024 09:30:14 +0200
4 Subject: [PATCH] net: airoha: configure hw mac address according to the port
5 id
6
7 GDM1 port on EN7581 SoC is connected to the lan dsa switch.
8 GDM{2,3,4} can be used as wan port connected to an external
9 phy module. Configure hw mac address registers according to the port id.
10
11 Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
12 Link: https://patch.msgid.link/20240821-airoha-eth-wan-mac-addr-v2-1-8706d0cd6cd5@kernel.org
13 Signed-off-by: Paolo Abeni <pabeni@redhat.com>
14 ---
15 drivers/net/ethernet/mediatek/airoha_eth.c | 32 ++++++++++++++++------
16 1 file changed, 23 insertions(+), 9 deletions(-)
17
18 --- a/drivers/net/ethernet/mediatek/airoha_eth.c
19 +++ b/drivers/net/ethernet/mediatek/airoha_eth.c
20 @@ -67,9 +67,11 @@
21 #define FE_RST_GDM3_MBI_ARB_MASK BIT(2)
22 #define FE_RST_CORE_MASK BIT(0)
23
24 +#define REG_FE_WAN_MAC_H 0x0030
25 #define REG_FE_LAN_MAC_H 0x0040
26 -#define REG_FE_LAN_MAC_LMIN 0x0044
27 -#define REG_FE_LAN_MAC_LMAX 0x0048
28 +
29 +#define REG_FE_MAC_LMIN(_n) ((_n) + 0x04)
30 +#define REG_FE_MAC_LMAX(_n) ((_n) + 0x08)
31
32 #define REG_FE_CDM1_OQ_MAP0 0x0050
33 #define REG_FE_CDM1_OQ_MAP1 0x0054
34 @@ -900,16 +902,28 @@ static void airoha_qdma_irq_disable(stru
35 airoha_qdma_set_irqmask(qdma, index, mask, 0);
36 }
37
38 -static void airoha_set_macaddr(struct airoha_eth *eth, const u8 *addr)
39 +static bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port)
40 {
41 - u32 val;
42 + /* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
43 + * GDM{2,3,4} can be used as wan port connected to an external
44 + * phy module.
45 + */
46 + return port->id == 1;
47 +}
48 +
49 +static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
50 +{
51 + struct airoha_eth *eth = port->qdma->eth;
52 + u32 val, reg;
53
54 + reg = airhoa_is_lan_gdm_port(port) ? REG_FE_LAN_MAC_H
55 + : REG_FE_WAN_MAC_H;
56 val = (addr[0] << 16) | (addr[1] << 8) | addr[2];
57 - airoha_fe_wr(eth, REG_FE_LAN_MAC_H, val);
58 + airoha_fe_wr(eth, reg, val);
59
60 val = (addr[3] << 16) | (addr[4] << 8) | addr[5];
61 - airoha_fe_wr(eth, REG_FE_LAN_MAC_LMIN, val);
62 - airoha_fe_wr(eth, REG_FE_LAN_MAC_LMAX, val);
63 + airoha_fe_wr(eth, REG_FE_MAC_LMIN(reg), val);
64 + airoha_fe_wr(eth, REG_FE_MAC_LMAX(reg), val);
65 }
66
67 static void airoha_set_gdm_port_fwd_cfg(struct airoha_eth *eth, u32 addr,
68 @@ -2341,7 +2355,7 @@ static int airoha_dev_set_macaddr(struct
69 if (err)
70 return err;
71
72 - airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
73 + airoha_set_macaddr(port, dev->dev_addr);
74
75 return 0;
76 }
77 @@ -2350,7 +2364,7 @@ static int airoha_dev_init(struct net_de
78 {
79 struct airoha_gdm_port *port = netdev_priv(dev);
80
81 - airoha_set_macaddr(port->qdma->eth, dev->dev_addr);
82 + airoha_set_macaddr(port, dev->dev_addr);
83
84 return 0;
85 }